home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sound / samples.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  3KB  |  121 lines

  1. #include "driver.h"
  2.  
  3.  
  4.  
  5. static int firstchannel,numchannels;
  6.  
  7.  
  8. /* Start one of the samples loaded from disk. Note: channel must be in the range */
  9. /* 0 .. Samplesinterface->channels-1. It is NOT the discrete channel to pass to */
  10. /* mixer_play_sample() */
  11. void sample_start(int channel,int samplenum,int loop)
  12. {
  13.     if (Machine->sample_rate == 0) return;
  14.     if (Machine->samples == 0) return;
  15.     if (Machine->samples->sample[samplenum] == 0) return;
  16.     if (channel >= numchannels)
  17.     {
  18.         logerror("error: sample_start() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
  19.         return;
  20.     }
  21.     if (samplenum >= Machine->samples->total)
  22.     {
  23.         logerror("error: sample_start() called with samplenum = %d, but only %d samples available\n",samplenum,Machine->samples->total);
  24.         return;
  25.     }
  26.  
  27.     if ( Machine->samples->sample[samplenum]->resolution == 8 )
  28.     {
  29.         logerror("play 8 bit sample %d, channel %d\n",samplenum,channel);
  30.         mixer_play_sample(firstchannel + channel,
  31.                 Machine->samples->sample[samplenum]->data,
  32.                 Machine->samples->sample[samplenum]->length,
  33.                 Machine->samples->sample[samplenum]->smpfreq,
  34.                 loop);
  35.     }
  36.     else
  37.     {
  38.         logerror("play 16 bit sample %d, channel %d\n",samplenum,channel);
  39.         mixer_play_sample_16(firstchannel + channel,
  40.                 (short *) Machine->samples->sample[samplenum]->data,
  41.                 Machine->samples->sample[samplenum]->length,
  42.                 Machine->samples->sample[samplenum]->smpfreq,
  43.                 loop);
  44.     }
  45. }
  46.  
  47. void sample_set_freq(int channel,int freq)
  48. {
  49.     if (Machine->sample_rate == 0) return;
  50.     if (Machine->samples == 0) return;
  51.     if (channel >= numchannels)
  52.     {
  53.         logerror("error: sample_adjust() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
  54.         return;
  55.     }
  56.  
  57.     mixer_set_sample_frequency(channel + firstchannel,freq);
  58. }
  59.  
  60. void sample_set_volume(int channel,int volume)
  61. {
  62.     if (Machine->sample_rate == 0) return;
  63.     if (Machine->samples == 0) return;
  64.     if (channel >= numchannels)
  65.     {
  66.         logerror("error: sample_adjust() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
  67.         return;
  68.     }
  69.  
  70.     mixer_set_volume(channel + firstchannel,volume * 100 / 255);
  71. }
  72.  
  73. void sample_stop(int channel)
  74. {
  75.     if (Machine->sample_rate == 0) return;
  76.     if (channel >= numchannels)
  77.     {
  78.         logerror("error: sample_stop() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
  79.         return;
  80.     }
  81.  
  82.     mixer_stop_sample(channel + firstchannel);
  83. }
  84.  
  85. int sample_playing(int channel)
  86. {
  87.     if (Machine->sample_rate == 0) return 0;
  88.     if (channel >= numchannels)
  89.     {
  90.         logerror("error: sample_playing() called with channel = %d, but only %d channels allocated\n",channel,numchannels);
  91.         return 0;
  92.     }
  93.  
  94.     return mixer_is_sample_playing(channel + firstchannel);
  95. }
  96.  
  97.  
  98.  
  99. int samples_sh_start(const struct MachineSound *msound)
  100. {
  101.     int i;
  102.     int vol[MIXER_MAX_CHANNELS];
  103.     const struct Samplesinterface *intf = msound->sound_interface;
  104.  
  105.     /* read audio samples if available */
  106.     Machine->samples = readsamples(intf->samplenames,Machine->gamedrv->name);
  107.  
  108.     numchannels = intf->channels;
  109.     for (i = 0;i < numchannels;i++)
  110.         vol[i] = intf->volume;
  111.     firstchannel = mixer_allocate_channels(numchannels,vol);
  112.     for (i = 0;i < numchannels;i++)
  113.     {
  114.         char buf[40];
  115.  
  116.         sprintf(buf,"Sample #%d",i);
  117.         mixer_set_name(firstchannel + i,buf);
  118.     }
  119.     return 0;
  120. }
  121.